package com.ruoyi.util.mysqljdbc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.util.mysqljdbc.Mysql8jdbc.EditOrselect;

/**
 * @Description: 使用java生成SQL脚本
 * @ClassName: ExportSqlCopy
 * @author syc
 * @date: 2022年9月10日 下午5:20:47
 *	这是根据一位大神的文章为参考,,自己进行了一点改造. 
 *	参考地址:  https://blog.csdn.net/TurboAnho/article/details/121230502
 */
public class ExportSqlCopy {
	
	public static final String sqlfilePath = "D:/sqltest/";
	public static final String tablename = "sys_role";
	public static final String dataBase = "ruoyi-05-24";
	public static final String host = "127.0.0.1";
	public static final String port = "3306";
	
//	public static void main(String[] args) {
//		ExportSqlCopy exportSqlCopy = new ExportSqlCopy();
//		String sql = "show create table `ruoyi-05-24`.`sys_role`";
//		String filePath = sqlfilePath + getTimePath() + "/" +tablename + ".sql";
//		String createTableSql = exportSqlCopy.getCreateTableSql(sql);
//		List<String> listSql = new ArrayList<String>();
//		/**
//		 *	获取表的创建语句
//		 */
//		listSql.add(createTableSql);
//		exportSqlCopy.createFile(listSql, filePath);
//		/**
//		 * 	获取数据数量
//		 */
//		Integer rowCount = exportSqlCopy.getTableDataCount("SELECT COUNT(*) FROM `ruoyi-05-24`.`sys_role`");	
//		if (rowCount != null && rowCount > 0) {
//			int pageSize = 1000;
//		    int pageCount = 1;
//			if(rowCount > pageSize) {
//				pageCount = rowCount / pageSize;
//				pageCount = pageCount + ((rowCount % pageSize) > 0 ? 1 : 0);
//		    }
//			for (int i = 0; i < pageCount ; i++) {
//				String selectSql = "SELECT * FROM `" + dataBase + "`.`" + tablename + "` WHERE 1=1 LIMIT " + i * pageSize + "," + pageSize ;	
//			    List<String> list =	Mysql8jdbc.jdbcCreactSql(Mysql8jdbc.driverMysql8, "127.0.0.1","3306", dataBase,"root","19901110", selectSql, tablename);
//			    exportSqlCopy.createFile(list, filePath);
//			}
//		}
//	}
	
	/**
	 * @Description:获取mysql数据库表的-->建表语句 
	 * @author syc
	 * @date: 2022年9月10日 下午5:28:03
	 */
	public String getCreateTableSql(String sql) {
		JSONObject json = Mysql8jdbc.jdbcGetJSON(Mysql8jdbc.driverMysql8, "127.0.0.1","3306", "ruoyi-05-24", "root", "19901110", sql, EditOrselect.select);
		if (json.getJSONArray("select") != null && json.getJSONArray("select").size() > 0) {
			return json.getJSONArray("select").getJSONObject(0).getString("Create Table");
		}
		return null;
	}
	
	/**
	 * @Description: 获取表中数据的条数
	 * @author syc
	 * @date: 2022年9月10日 下午7:43:50
	 *	为什么要用Integer而不是Long,......因为如果大小超过了int的上限,那还导个锤子.早点洗洗睡吧
	 */
	public Integer getTableDataCount(String sql) {
		JSONObject json = Mysql8jdbc.jdbcGetJSON(Mysql8jdbc.driverMysql8, "127.0.0.1","3306", "ruoyi-05-24", "root", "19901110", sql, EditOrselect.count);
		return json.getInteger(EditOrselect.count.name());
	}
	
	
	/**
	 * @Description: 创建insertsql.sql文件,并写入数据
	 * @author syc
	 * @date: 2022年9月10日 下午7:30:35
	 */
	@SuppressWarnings("unused")
	private boolean createFile(List<String> sqlList, String filePath) {
        if (StringUtils.isBlank(tablename) || StringUtils.isBlank(filePath) || sqlList == null || sqlList.size() == 0) {
        	return false;
        }
    	File file = new File(filePath);
        if (!file.exists()) {
    		File file2 = new File(filePath.substring(0, filePath.lastIndexOf("/")));
    		if (!file2.exists()) {
    			file2.mkdirs();//创建多层级目录
    		}
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fw = new FileWriter(file, true);
            bw = new BufferedWriter(fw);
            for (int i = 0; i < sqlList.size(); i++) {
				bw.append(sqlList.get(i));
				bw.append("\n");
			}
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

	/**
	 * @Description: 
	 * @author syc
	 * @date: 2022年9月10日 下午8:13:44
	 */
	public static String getTimePath() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		return sdf.format(new Date());
	}
	
}
